package com.atguigu.es.demo;

import com.atguigu.es.beans.Emp;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;

import java.io.IOException;
import java.util.List;

/**
 * Created by Smexy on 2021/7/9
 *
 *      ①创建一个客户端对象
 *              JestClient
 *
 *                  使用了工厂模式和建筑者模式！
 *                         创建一个对象的时候，尽量不要调用构造器！
 *                        举例： 获取一个A对象
 *                                  AFactory.getA()
 *
 *                           A a  =  ABuilder.setName(xx).setAge(yyy).build()
 *                              等价于
 *                            A a  =   new A(xxx,yyy)
 *      ②读： 准备读命令
 *        写： 准备写的命令
 *
 *        发送RESTFUL 请求，通过请求参数，表示对数据的操作类型
 *              GET ： 查询
 *              POST ：新增
 *              DELETE :删除
 *
 *          在javaAPI,使用方法，表达对不同数据的操作类型，把restful屏蔽！
 *
 *           <T extends JestResult> T execute(Action<T> clientRequest)
 *
 *                  Action: 命令类型
 *                      读：  Search
 *                      写 :
 *                              删除：Delete
 *
 *                              增和改：  index
 *                              批量写:   Bulk
 *
 *       ③执行命令
 *       ④读操作，接受返回的结果
 *              遍历结果
 */
public class READDemo1 {

    public static void main(String[] args) throws IOException {

        //创建一个 JestClientFactory
        JestClientFactory jestClientFactory = new JestClientFactory();

        HttpClientConfig httpClientConfig = new HttpClientConfig.Builder("http://hadoop102:9200").build();

        jestClientFactory.setHttpClientConfig(httpClientConfig);

        // 从工厂中获取一个 客户端对象
        JestClient jestClient = jestClientFactory.getObject();

        //将查询的DSL语句传入,只封装请求体
        String query=
                "{\n" +
                "   \"query\": {\n" +
                "     \n" +
                "     \"match\": {\n" +
                "       \"hobby\": \"吃饭睡觉\"\n" +
                "     }\n" +
                "     \n" +
                "   }\n" +
                "  \n" +
                "}";

        //GET /test/emps/_search
        Search search = new Search.Builder(query)
                .addIndex("test")
                .addType("emps")
                .build();

        // 对应 hits
        SearchResult searchResult = jestClient.execute(search);

        //遍历结果
        System.out.println(searchResult.getTotal());

        System.out.println(searchResult.getMaxScore());

        // 对应  hits.hits
        List<SearchResult.Hit<Emp, Void>> hits = searchResult.getHits(Emp.class);

        for (SearchResult.Hit<Emp, Void> hit : hits) {

            System.out.println("_index:"+hit.index);
            System.out.println("_type:"+hit.type);
            System.out.println("_id:"+hit.id);
            System.out.println("_score:"+hit.score);

            System.out.println(hit.source);

        }


        //关闭客户端
        jestClient.close();


    }
}
